home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d20 / pvert.arc / QWK2PKT.C < prev    next >
Text File  |  1992-01-15  |  9KB  |  355 lines

  1. #ifdef OS2
  2.  #define INCL_DOS
  3.  #include <os2.h>
  4. #endif
  5. #include <ctype.h>
  6. #include <stdlib.h>
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include <time.h>
  10. #include <sys/types.h>
  11. #include <sys/stat.h>
  12. #include <errno.h>
  13. #include "qwk.h"
  14. #include "xqwk.h"
  15. #include "xmsg.h"
  16. #include "pkt.h"
  17. #include "addr.h"
  18.  
  19. PKTHDR * fill_in_pkt_hdr (PKTHDR *pkt,ADDR *myaddr,ADDR *addr,char *password);
  20. int      write_pkt_msg (FILE *fp,XMSG *amsg,char *text,char *area);
  21.  
  22. extern char * rstrip (char *);
  23. extern char * stripcr (char *);
  24. extern char * stristr (char *t, char *s);
  25.  
  26.  
  27.  
  28. int main (int argc,char *argv[]) {
  29.  
  30.     ADDR from,to;
  31.     XMSG msg;
  32.     char *p,s[QWKBLKSIZE + 1],*hold,bbsid[9] = "",pktname[13];
  33.     char qwkpkt[13] = "MESSAGES.DAT";
  34.     FILE *pkt,*qwk;
  35.     int  c,error,isrep = 0,makelist = 0;
  36.     long numareas,nummsgs = 0L,secs;
  37.     QWKAREAS *head,*info,*lastarea = NULL;
  38.     struct stat st;
  39.     PKTHDR pkthdr;
  40.     time_t start;
  41.  
  42.  
  43.     printf("\n                      P-VERT"
  44.            "\nQWK2PKT; converts QWK packets to Fidonet type 2 packets.\n");
  45.  
  46.     start = time(NULL);
  47.  
  48.     if(argc < 3) {
  49.         printf("\nUsage: QWK2PKT <from_address> <to_address> [-R(eplypkt)] [-T(able)]\n");
  50.         return 1;
  51.     }
  52.  
  53.     memset(&from,0,sizeof(ADDR));
  54.     memset(&to,0,sizeof(ADDR));
  55.  
  56.     p = argv[1];
  57.     if(parse_addr(&p,&from,NULL)) {
  58.         printf("\nInvalid <from_address> -- must be 5-D Fidonet format"
  59.                "\nexample:  1:380/16.0@Fidonet\n");
  60.         return 2;
  61.     }
  62.  
  63.     p = argv[2];
  64.     if(parse_addr(&p,&to,NULL)) {
  65.         printf("\nInvalid <to_address> -- must be 5-D Fidonet format"
  66.                "\nexample:  1:380/16.0@Fidonet\n");
  67.         return 3;
  68.     }
  69.  
  70.     for(c = 3;c < argc;c++) {
  71.         p = argv[c];
  72.         while(*p == '/' || *p == '-') p++;
  73.         switch(toupper(*p)) {
  74.             case 'R':   isrep = 1;
  75.                         break;
  76.  
  77.             case 'T':   makelist = 1;
  78.                         break;
  79.  
  80.             default:    printf("\nUnknown option \"%c\"\n",*p);
  81.                         break;
  82.         }
  83.     }
  84.  
  85.     qwk = fopen("CONTROL.DAT","rt");
  86.     if(!qwk) {
  87.         printf("\nCan't open CONTROL.DAT\n");
  88.         return 4;
  89.     }
  90.  
  91.     for(c = 0;c < 5;c++) {
  92.         if(!fgets(s,80,qwk)) {
  93.             fclose(qwk);
  94.             printf("\nCONTROL.DAT is screwed\n");
  95.             return 5;
  96.         }
  97.     }
  98.  
  99.     stripcr(s);
  100.     rstrip(s);
  101.     p = strchr(s,',');
  102.     if(p && *(++p)) strncpy(bbsid,p,8);
  103.     bbsid[8] = 0;
  104.  
  105.     for(c = 5;c < 10;c++) {
  106.         if(!fgets(s,80,qwk)) {
  107.             fclose(qwk);
  108.             printf("\nCONTROL.DAT is screwed\n");
  109.             return 5;
  110.         }
  111.     }
  112.  
  113.     head = qwkarearead(qwk,&numareas);
  114.     fclose(qwk);
  115.     if(!head) {
  116.         printf("\nCONTROL.DAT is screwed or out of memory, take your pick.\n");
  117.         return 6;
  118.     }
  119.  
  120.     printf("\nProcessing %ld area%s\n",numareas,&"s"[numareas == 1L]);
  121.  
  122.     if(isrep) {
  123.         if(*bbsid) sprintf(qwkpkt,"%s.MSG",bbsid);
  124.         else strcpy(qwkpkt,"MESSAGES.MSG");
  125.     }
  126.  
  127.     qwk = fopen(qwkpkt,"rb");
  128.     if(!qwk) {
  129.         printf("\nCan't open %s\n",qwkpkt);
  130.         qwkfreeareas(head);
  131.         return 7;
  132.     }
  133.  
  134.     if(!qwkreadblk(qwk,s) || !stristr(s,"copyright")) {
  135.         fclose(qwk);
  136.         qwkfreeareas(head);
  137.         printf("\n%s is screwed\n",qwkpkt);
  138.         return 8;
  139.     }
  140.  
  141.     if(*bbsid) {
  142.         sprintf(s,"%s.PKT",bbsid);
  143.     }
  144.     else {
  145.         sprintf(s,"%lx.PKT",time(NULL));
  146.         while(!stat(s,&st)) {
  147.             sprintf(s,"%lx.PKT",time(NULL));
  148.         }
  149.     }
  150.     strcpy(pktname,s);
  151.  
  152.     pkt = fopen(pktname,"wb");
  153.     if(!pkt) {
  154.         fclose(qwk);
  155.         printf("\nCan't open packet %s\n",pktname);
  156.         qwkfreeareas(head);
  157.         return 9;
  158.     }
  159.  
  160.     printf("Building %s\n",pktname);
  161.  
  162.     if(fwrite(fill_in_pkt_hdr(&pkthdr,&from,&to,""),1,sizeof(PKTHDR),pkt) == 65535U) {
  163.         printf("\nError writing to packet %s\n",pktname);
  164.         fclose(qwk);
  165.         fclose(pkt);
  166.         qwkfreeareas(head);
  167.         return 10;
  168.     }
  169.     fwrite("\0",2,1,pkt);
  170.     fseek(pkt,ftell(pkt) - 2L,SEEK_SET);
  171.  
  172.     while(!feof(qwk)) {
  173. #ifdef OS2
  174.         DosSleep(0L);
  175. #endif
  176.         msg.orig = from.node;
  177.         msg.dest = to.node;
  178.         msg.orig_net = from.net;
  179.         msg.dest_net = to.net;
  180.         msg.o_zone = msg.d_zone = 0;
  181.         msg.o_point = msg.d_point = 0;
  182.         info = xreadqwkmsg(qwk,&msg,&hold,head,&error,isrep);
  183.         if(!info || !hold || error != MSG_NOERR) {
  184.             if(!info && error == MSG_BADAREA) {
  185.                 if(hold) free(hold);
  186.                 printf("\n? Unknown area skipped...\n");
  187.                 lastarea = NULL;
  188.                 continue;
  189.             }
  190.             if(error != MSG_NOERR && error != MSG_NOTEXT &&
  191.               error != MSG_NOMOREMSGS) {
  192.                 printf("\nError %d, errno = %d; aborting...\n",error,errno);
  193.                 fclose(qwk);
  194.                 fclose(pkt);
  195.                 qwkfreeareas(head);
  196.                 return 11;
  197.             }
  198.             if(error == MSG_NOMOREMSGS) {
  199.                 if(hold) free(hold);
  200.                 break;
  201.             }
  202.             if(error == MSG_NOTEXT) {
  203.                 if(hold) free(hold);
  204.                 continue;
  205.             }
  206.         }
  207.         if(lastarea != info) {
  208.             printf("\n%s ",info->name);
  209.             lastarea = info;
  210.         }
  211.         printf("%-09ld\b\b\b\b\b\b\b\b\b",++nummsgs);
  212.         write_pkt_msg(pkt,&msg,hold,info->name);
  213.         free(hold);
  214.     }
  215.  
  216.     fclose(qwk);
  217.     fclose(pkt);
  218.  
  219.     printf("\n\nRuntime: %ld mins %ld secs for %ld message%s",
  220.            (time(NULL) - start) / 60L,(time(NULL) - start) % 60L,
  221.            nummsgs,&"s"[nummsgs == 1]);
  222.     if(nummsgs && !stat(qwkpkt,&st)) {
  223.         numareas = st.st_size;
  224.         if(!stat(pktname,&st)) {
  225.             printf("\n\nSpace difference, QWK - PKT: %ld byte%s (not counting indexes, etc.)\n",
  226.                    numareas - st.st_size,&"s"[(numareas - st.st_size) == 1L]);
  227.             if(numareas > st.st_size) {  /* negatives screw up simple-minded calculation */
  228.                 secs = (long)max(1L,(((((numareas - st.st_size) * 10L) / 2400L) * 100L) / 80L));
  229.                 if(secs) printf("Approximately %ld percent, or %ld second%s @ 2400 baud.\n",
  230.                                 100L - ((st.st_size * 100L) / numareas),secs,&"s"[secs == 1L]);
  231.             }
  232.         }
  233.     }
  234.  
  235.     if(!nummsgs || stat(pktname,&st) || st.st_size < 61L) {
  236.         unlink(pktname);
  237.         printf("\nProblem conversion:  no cleanup.\n");
  238.     }
  239.     else {
  240.         printf("\nCleaning up");
  241.         unlink("CONTROL.DAT");
  242.         unlink("DOOR.ID");
  243.         unlink(qwkpkt);
  244.         info = head;
  245.         if(makelist) {
  246.             p = strchr(pktname,'.');
  247.             if(p) {
  248.                 *p = 0;
  249.                 strcat(pktname,".TBL");
  250.                 qwk = fopen(pktname,"wt");
  251.                 if(!qwk) makelist = 0;
  252.                 else printf(" and building area table");
  253.             }
  254.             else makelist = 0;
  255.         }
  256.         printf(".\n");
  257.         while(info) {
  258.             if(makelist) {
  259.                 fprintf(qwk,"%d,%s\n",info->confnum,info->name);
  260.             }
  261.             sprintf(s,"%03d.NDX",info->confnum - 1);
  262.             unlink(s);
  263.             info = info->next;
  264.         }
  265.         if(makelist) fclose(qwk);
  266.     }
  267.  
  268.     qwkfreeareas(head);
  269.     return 0;
  270. }
  271.  
  272.  
  273.  
  274. PKTHDR * fill_in_pkt_hdr (PKTHDR *pkt,ADDR *myaddr,ADDR *addr,char *password) {
  275.  
  276.     memset(pkt,0,sizeof(PKTHDR));
  277.  
  278.     pkt->onode = myaddr->node;
  279.     pkt->onet = myaddr->net;
  280.     pkt->ozone = myaddr->zone;
  281.     pkt->opoint = myaddr->point;
  282.     pkt->dnode = addr->node;
  283.     pkt->dnet = addr->net;
  284.     pkt->dpoint = addr->point;
  285.     pkt->dzone = addr->zone;
  286.     strncpy(pkt->odomain,myaddr->domain,8);
  287.     strncpy(pkt->ddomain,addr->domain,8);
  288.  
  289.     strncpy(pkt->password,password,8);
  290.  
  291.     pkt->version = 2;
  292.     pkt->subver = 2;
  293.     pkt->product = 0;
  294.     pkt->rev_lev = 0;
  295.  
  296.     return pkt;
  297. }
  298.  
  299.  
  300.  
  301. int write_pkt_msg (FILE *fp,XMSG *amsg,char *text,char *area) {
  302.  
  303.     char pmsg[192],*p;
  304.     unsigned int x;
  305.  
  306.  
  307.     /* Write the message given to the end of the file given as a
  308.        packed msg */
  309.  
  310.     memset(pmsg,192,0);
  311.     *pmsg = 0x02;
  312.     pmsg[1] = 0x00;
  313.     memcpy(&pmsg[2],&amsg->orig,2);
  314.     memcpy(&pmsg[4],&amsg->dest,2);
  315.     memcpy(&pmsg[6],&amsg->orig_net,2);
  316.     memcpy(&pmsg[8],&amsg->dest_net,2);
  317.     memcpy(&pmsg[10],&amsg->attr,2);
  318.     x = 0;
  319.     memcpy(&pmsg[12],&x,2);
  320.     for(x = 0;x < 20;x++) if(!amsg->date[x]) amsg->date[x] = 'Q';
  321.     amsg->date[19] = 0;
  322.     memcpy(&pmsg[14],amsg->date,20);    
  323.     p = &pmsg[34];
  324.     strcpy(p,amsg->to);
  325.     x = 34;
  326.     while(*p){
  327.         x++;
  328.         p++;
  329.     }
  330.     p++;
  331.     x++;
  332.     strcpy(p,amsg->from);
  333.     while(*p){
  334.         x++;
  335.         p++;
  336.     }
  337.     x++;
  338.     p++;
  339.     strcpy(p,amsg->subj);
  340.     while(*p){
  341.         x++;
  342.         p++;
  343.     }
  344.     x++;
  345.     p++;
  346.     fwrite(pmsg,x,1,fp);
  347.     if(area && *area) {             /* Prepend area tag */
  348.         fprintf(fp,"AREA: %s\r",area);
  349.     }
  350.     fwrite(text,strlen(text),1,fp);
  351.     fwrite("\0\0",3,1,fp);
  352.     fseek(fp,(ftell(fp) - 2L),SEEK_SET);  /* Ready for another msg */
  353.     return 1;
  354. }
  355.